package demo7;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

@Component
public class Person {
    @Value("张三")
    public void setName(String name) {
        System.out.println("Person的name属性对应的setName方法调用了...");
        this.name = name;
    }
    /*
    @PostConstruct注解是一个生命周期注解
    Spring在将该对象初始化完毕（构造器执行后，set方法执行后）会调用该方法
    该方法的方法名任意定义，重点是标注注解
     */
    @PostConstruct
    public void init(){
        System.out.println("Person对象被@PostConstruct标注的方法执行了...");
    }
    /*
    @PreDestroy注解
    被该注解标注的方法的调用时机：
    当Spring容器关闭时，Spring容器会调用内部管理对象的被@PreDestroy注解标注的方法
     */
    @PreDestroy
    public void preDestory(){
        System.out.println("Person对象被@PreDestroy标注的方法执行了...");
    }

    /*
        构造器是一个对象生命周期中的第一个方法，当一个对象实例化时
        JVM首先为对象分配内存空间，初始化对象属性内存等
        然后就会调用构造器方法
         */
    private String name;

    public Person(){
        System.out.println("Person的构造器执行了");
    }
    /*
    关联面试题：
    请分别解释：final，finally finalize分别是什么
    findlize是Object中定义的一个方法，这意味着所有的类都有该方法
    他是一个对象生命周期中最后一个被调用的方法：
    当GC发现一个对象没有任何被引用时，就会将其销毁，销毁前最后会调用它的finalize方法
    该方法调用完毕对象被销毁
    API手册中对该方法有明确说明，它不应当有耗时的操作，否则会影响GC性能。
     */

    @Override
    protected void finalize() throws Throwable {
        super.finalize();
    }
}


